const OpColorMatrix *op)
{
float mat[16];
- float vec[4];
OP_PRINT (" -> Color Matrix");
graphene_matrix_to_float (op->matrix, mat);
glUniformMatrix4fv (program->color_matrix.color_matrix_location, 1, GL_FALSE, mat);
- graphene_vec4_to_float (op->offset, vec);
- glUniform4fv (program->color_matrix.color_offset_location, 1, vec);
+ if (op->offset.send)
+ {
+ float vec[4];
+ graphene_vec4_to_float (op->offset.value, vec);
+ glUniform4fv (program->color_matrix.color_offset_location, 1, vec);
+ }
}
static inline void
{
ProgramState *current_program_state = get_current_program_state (builder);
OpColorMatrix *op;
+ bool offset_equal;
+
+ offset_equal = memcmp (offset,
+ ¤t_program_state->color_matrix.offset,
+ sizeof (graphene_vec4_t)) == 0;
if (memcmp (matrix,
¤t_program_state->color_matrix.matrix,
sizeof (graphene_matrix_t)) == 0 &&
- memcmp (offset,
- ¤t_program_state->color_matrix.offset,
- sizeof (graphene_vec4_t)) == 0)
+ offset_equal)
return;
current_program_state->color_matrix.matrix = *matrix;
- current_program_state->color_matrix.offset = *offset;
op = ops_begin (builder, OP_CHANGE_COLOR_MATRIX);
op->matrix = matrix;
- op->offset = offset;
+
+ if (!offset_equal)
+ {
+ op->offset.value = offset;
+ op->offset.send = TRUE;
+
+ current_program_state->color_matrix.offset = *offset;
+ }
+ else
+ op->offset.send = FALSE;
}
void
typedef struct { float value[2]; guint send: 1; } Float2UniformValue;
typedef struct { GskRoundedRect value; guint send: 1; guint send_corners: 1; } RRUniformValue;
typedef struct { const GdkRGBA *value; guint send: 1; } RGBAUniformValue;
+typedef struct { const graphene_vec4_t *value; guint send: 1; } Vec4UniformValue;
/* OpNode are allocated within OpBuffer.pos, but we keep
* a secondary index into the locations of that buffer
typedef struct
{
const graphene_matrix_t *matrix;
- const graphene_vec4_t *offset;
+ Vec4UniformValue offset;
} OpColorMatrix;
typedef struct